package com.anjiplus.template.gaea.business.modules.reportexcel.util;

import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 来自：https://github.com/mengshukeji/LuckysheetServer
 *
 * @author cr
 */
public class ConstantUtil {

	/**
	 * 导出。字体转换
	 */
	public static Map<Integer, String> ff_IntegerToName = new HashMap<Integer, String>();

	/**
	 * 导入。字体转换
	 */
	public static Map<String, Integer> ff_NameToInteger = new HashMap<String, Integer>();

	/**
	 * 导入 36种数字格式。注意官方文档的编号不是连续的，22后面直接是37，所以数组中间补14个空值
	 */
	public static String[] number_type = null;

	/**
	 * 导入 36种格式的定义字符串
	 */
	public static String[] number_format = null;

	/**
	 * 数据类型
	 */
	public static Map<String, Integer> number_format_map = new HashMap<String, Integer>();

	static {
		// 格式
		nf();
		// 字体
		ff();
	}

	private static void nf() {
		number_type = new String[] { "General", "Decimal", "Decimal", "Decimal", "Decimal", "Currency", "Currency",
				"Currency", "Currency", "Percentage", "Percentage", "Scientific", "Fraction", "Fraction", "Date",
				"Date", "Date", "Date", "Time", "Time", "Time", "Time", "Time", "", "", "", "", "", "", "", "", "", "",
				"", "", "", "", "Accounting", "Accounting", "Accounting", "Accounting", "Accounting", "Currency",
				"Accounting", "Currency", "Time", "Time", "Time", "Scientific", "Text" };

		number_format = new String[] { "General", "0", "0.00", "#,##0", "#,##0.00", "$#,##0;($#,##0)",
				"$#,##0;[Red]($#,##0)", "$#,##0.00;($#,##0.00)", "$#,##0.00;[Red]($#,##0.00)", "0%", "0.00%",
				"0.00E+00", "# ?/?", "# ??/??", "m/d/yyyy", "d-mmm-yy", "d-mmm", "mmm-yy", "h:mm AM/PM",
				"h:mm:ss AM/PM", "h:mm", "h:mm:ss", "m/d/yyyy h:mm", "", "", "", "", "", "", "", "", "", "", "", "", "",
				"", "#,##0;(#,##0)", "#,##0;[Red](#,##0)", "#,##0.00;(#,##0.00)", "#,##0.00;[Red](#,##0.00)",
				"_ * #,##0_ ;_ * (#,##0)_ ;_ * \"-\"_ ;_ @_", "_ $* #,##0_ ;_ $* (#,##0)_ ;_ $* \"-\"_ ;_ @_",
				"_ * #,##0.00_ ;_ * (#,##0.00)_ ;_ * \"-\"??_ ;_ @_",
				"_ $* #,##0.00_ ;_ $* (#,##0.00)_ ;_ $* \"-\"??_ ;_ @_", "mm:ss", "[h]:mm:ss", "mm:ss.0", "##0.0E+00",
				"@" };
		for (int x = 0; x < number_format.length; x++) {
			if (number_format[x].length() > 0) {
				number_format_map.put(number_format[x].toLowerCase(), x);
			}
		}
	}

	private static void ff() {
		// 0 微软雅黑、1 宋体（Song）、2 黑体（ST Heiti）、3 楷体（ST Kaiti）、 4仿宋（ST FangSong）、 5 新宋体（ST
		// Song）、
		// 6 华文新魏、 7华文行楷、 8 华文隶书、 9 Arial、 10 Times New Roman 、11 Tahoma 、12 Verdana
		ff_IntegerToName.put(0, "微软雅黑");
		ff_IntegerToName.put(1, "宋体");
		ff_IntegerToName.put(2, "黑体");
		ff_IntegerToName.put(3, "楷体");
		ff_IntegerToName.put(4, "仿宋");
		ff_IntegerToName.put(5, "新宋体");
		ff_IntegerToName.put(6, "华文新魏");
		ff_IntegerToName.put(7, "华文行楷");
		ff_IntegerToName.put(8, "华文隶书");
		ff_IntegerToName.put(9, "Arial");
		ff_IntegerToName.put(10, "Times New Roman");
		ff_IntegerToName.put(11, "Tahoma");
		ff_IntegerToName.put(12, "Verdana");

		// 0 微软雅黑、1 宋体（Song）、2 黑体（ST Heiti）、3 楷体（ST Kaiti）、 4仿宋（ST FangSong）、 5 新宋体（ST
		// Song）、
		// 6 华文新魏、 7华文行楷、 8 华文隶书、 9 Arial、 10 Times New Roman 、11 Tahoma 、12 Verdana
		ff_NameToInteger.put("微软雅黑", 0);
		ff_NameToInteger.put("宋体", 1);
		ff_NameToInteger.put("Song", 1);
		ff_NameToInteger.put("黑体", 2);
		ff_NameToInteger.put("ST Heiti", 2);
		ff_NameToInteger.put("楷体", 3);
		ff_NameToInteger.put("ST Kaiti", 3);
		ff_NameToInteger.put("仿宋", 4);
		ff_NameToInteger.put("ST FangSong", 4);
		ff_NameToInteger.put("新宋体", 5);
		ff_NameToInteger.put("ST Song", 5);
		ff_NameToInteger.put("华文新魏", 6);
		ff_NameToInteger.put("华文行楷", 7);
		ff_NameToInteger.put("华文隶书", 8);
		ff_NameToInteger.put("Arial", 9);
		ff_NameToInteger.put("Times New Roman", 10);
		ff_NameToInteger.put("Tahoma", 11);
		ff_NameToInteger.put("Verdana", 12);
	}

	private static void borderType() {
		// "border-left" | "border-right" | "border-top" | "border-bottom" | "border-all"
		// | "border-outside" | "border-inside" | "border-horizontal" | "border-vertical"
		// | "border-none"
		ff_IntegerToName.put(0, "微软雅黑");
		ff_IntegerToName.put(1, "宋体");
		ff_IntegerToName.put(2, "黑体");
		ff_IntegerToName.put(3, "楷体");
		ff_IntegerToName.put(4, "仿宋");
		ff_IntegerToName.put(5, "新宋体");
		ff_IntegerToName.put(6, "华文新魏");
		ff_IntegerToName.put(7, "华文行楷");
		ff_IntegerToName.put(8, "华文隶书");
		ff_IntegerToName.put(9, "Arial");
		ff_IntegerToName.put(10, "Times New Roman");
		ff_IntegerToName.put(11, "Tahoma");
		ff_IntegerToName.put(12, "Verdana");

		// 0 微软雅黑、1 宋体（Song）、2 黑体（ST Heiti）、3 楷体（ST Kaiti）、 4仿宋（ST FangSong）、 5 新宋体（ST
		// Song）、
		// 6 华文新魏、 7华文行楷、 8 华文隶书、 9 Arial、 10 Times New Roman 、11 Tahoma 、12 Verdana
		ff_NameToInteger.put("微软雅黑", 0);
		ff_NameToInteger.put("宋体", 1);
		ff_NameToInteger.put("Song", 1);
		ff_NameToInteger.put("黑体", 2);
		ff_NameToInteger.put("ST Heiti", 2);
		ff_NameToInteger.put("楷体", 3);
		ff_NameToInteger.put("ST Kaiti", 3);
		ff_NameToInteger.put("仿宋", 4);
		ff_NameToInteger.put("ST FangSong", 4);
		ff_NameToInteger.put("新宋体", 5);
		ff_NameToInteger.put("ST Song", 5);
		ff_NameToInteger.put("华文新魏", 6);
		ff_NameToInteger.put("华文行楷", 7);
		ff_NameToInteger.put("华文隶书", 8);
		ff_NameToInteger.put("Arial", 9);
		ff_NameToInteger.put("Times New Roman", 10);
		ff_NameToInteger.put("Tahoma", 11);
		ff_NameToInteger.put("Verdana", 12);
	}

	/**
	 * 按自定义格式
	 * @param fa
	 * @return
	 */
	public static Integer getNumberFormatMap(String fa) {
		if (number_format_map.containsKey(fa.toLowerCase())) {
			return number_format_map.get(fa.toLowerCase());
		}
		return -1;
	}

	/**
	 * 获取poi表格垂直对齐 0 中间、1 上、2下
	 * @param i
	 * @return
	 */
	public static VerticalAlignment getVerticalType(int i) {
		if (0 == i) {
			return VerticalAlignment.CENTER;
		}
		else if (1 == i) {
			return VerticalAlignment.TOP;
		}
		else if (2 == i) {
			return VerticalAlignment.BOTTOM;
		}
		// 默认居中
		return VerticalAlignment.CENTER;
	}

	/**
	 * 获取poi表格水平对齐 0 居中、1 左、2右
	 * @param i
	 * @return
	 */
	public static HorizontalAlignment getHorizontaltype(int i) {
		if (2 == i) {
			return HorizontalAlignment.RIGHT;
		}
		else if (1 == i) {
			return HorizontalAlignment.LEFT;
		}
		else if (0 == i) {
			return HorizontalAlignment.CENTER;
		}
		// 默认右
		return HorizontalAlignment.RIGHT;
	}

	/**
	 * 文字旋转 文字旋转角度（0=0,1=45，2=-45，3=竖排文字，4=90，5=-90）
	 * @param i
	 * @return
	 */
	public static short getRotation(int i) {
		short t = 0;
		switch (i) {
		case 1:
			t = 45;
			break;
		case 2:
			t = -45;
			break;
		case 3:
			t = 255;
			break;
		case 4:
			t = 90;
			break;
		case 5:
			t = -90;
			break;

		default:
			t = 0;
		}
		return t;
	}

	private static SimpleDateFormat df_DateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	public static Date stringToDateTime(String date) {
		if (date == null || date.length() == 0) {
			return null;
		}
		try {
			return df_DateTime.parse(date);
		}
		catch (ParseException e) {
			return null;
		}
	}

	private static SimpleDateFormat df_Date = new SimpleDateFormat("yyyy-MM-dd");

	public static Date stringToDate(String date) {
		if (date == null || date.length() == 0) {
			return null;
		}
		try {
			return df_Date.parse(date);
		}
		catch (ParseException e) {
			return null;
		}
	}

	public static Date toDate(String numberString) {
		try {
			Double _d = Double.parseDouble(numberString);
			String _s = toDate(_d, "yyyy-MM-dd HH:mm:ss");
			if (numberString.indexOf(".") > -1) {
				return stringToDate(_s);
			}
			else {
				return stringToDateTime(_s);
			}

		}
		catch (Exception ex) {
			System.out.println(ex.toString() + " " + numberString);
		}
		return null;
	}

	private static final int SECONDS_PER_MINUTE = 60;

	private static final int MINUTES_PER_HOUR = 60;

	private static final int HOURS_PER_DAY = 24;

	private static final int SECONDS_PER_DAY = (HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE);

	/**
	 * 一天的毫秒数
	 **/
	private static final long DAY_MILLISECONDS = SECONDS_PER_DAY * 1000L;

	/**
	 * 转换方法
	 *
	 * @parma numberString 要转换的浮点数
	 * @parma format 要获得的格式 例如"hh:mm:ss"
	 **/
	public static String toDate(double numberString, String format) {
		SimpleDateFormat sdFormat = new SimpleDateFormat(format);
		int wholeDays = (int) Math.floor(numberString);
		int millisecondsInday = (int) ((numberString - wholeDays) * DAY_MILLISECONDS + 0.5);
		Calendar calendar = new GregorianCalendar();
		setCalendar(calendar, wholeDays, millisecondsInday, false);
		return sdFormat.format(calendar.getTime());
	}

	private static void setCalendar(Calendar calendar, int wholeDays, int millisecondsInDay, boolean use1904windowing) {
		int startYear = 1900;
		int dayAdjust = -1; // Excel thinks 2/29/1900 is a valid date, which it isn't
		if (use1904windowing) {
			startYear = 1904;
			dayAdjust = 1; // 1904 date windowing uses 1/2/1904 as the first day
		}
		else if (wholeDays < 61) {
			// Date is prior to 3/1/1900, so adjust because Excel thinks 2/29/1900 exists
			// If Excel date == 2/29/1900, will become 3/1/1900 in Java representation
			dayAdjust = 0;
		}
		calendar.set(startYear, 0, wholeDays + dayAdjust, 0, 0, 0);
		calendar.set(GregorianCalendar.MILLISECOND, millisecondsInDay);
	}

}
